﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace INSA
{
    public partial class FormBasicInfo : Form

    {

        //txtOrganName 컨트롤을 다른 폼에서 컨트롤 하기 위한 전역 변수
        private static TextBox txtStaticOrganName = null;
              

        //폼의 정보를 저장하기 위한 모델 객체
        private ModelValuerInfo mvi = new ModelValuerInfo();

        //mvi 전역 변수
        private static ModelValuerInfo smvi;

        internal static ModelValuerInfo Smvi
        {
            get { return FormBasicInfo.smvi; }
            set { FormBasicInfo.smvi = value; }
        }        

        public FormBasicInfo()
        {
            InitializeComponent();

            //소속기관 전역변수에 설정
            txtStaticOrganName = this.txtOrganName;

            //smvi 설정
            Smvi = mvi;

            //교과목 그룹 설정
            setSubjectGroup();

            if (Config.State == Config.STATE_OK)
            {

                //mvi 객체 세팅
                setMVIFromDB();

                btnPWModify.Enabled = true;

                //control 세팅 <- mvi 객체
                setControlFromMVI();

            }
            else {

                btnPWModify.Enabled = false;
            
            }
        }

        /*******************************
         * 이벤트 메서드 모음
         *******************************/

        //닫기 버튼 클릭
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //찾기 버튼 클릭
        private void btnSearch_Click(object sender, EventArgs e)
        {
            Form f = new FormOrganInfo();            
            f.ShowDialog(this);
        }


        //교과목 그룹 콤보 박스에서 항목을 변경한 후
        private void cboSubjectGroup_SelectionChangeCommitted(object sender, EventArgs e)
        {
            setSubject();
        }

                
        //저장 버튼 클릭
        private void btnSave_Click(object sender, EventArgs e)
        {
            bool bChk = false;//쿼리작업결과상태변수

            
            if (checkInputValue() == true)
            {
                
                //mvi객체에 값을 설정
                setMVIFromInput();


                if (Config.State == Config.STATE_OK)     //기존 데이터가 있을 경우
                {
                    //비밀번호 검사 해야 함
                    if (DBUtil.checkPassword(mvi.Inx, txtPasswd.Text) == false)
                    {
                        MessageBox.Show("비밀번호가 옳바르지 않습니다.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtPasswd.Text = "";
                        txtPasswd.Focus();
                        return;
                    }

                    //업데이트
                    bChk = updateData();
                }
                else
                {
                    bChk = insertData();//새로 삽입

                    //static 컨트롤 활성화
                    FormMain.setStaticEnabled();

                    //환경설정 값 수정
                    Config.State = Config.STATE_OK;
                }

                if (bChk == false)
                {
                    MessageBox.Show("데이터를 저장하는 중에 예기치 않은 오류가 발생했습니다.   ", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("데이터가 정상적으로 저장되었습니다.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.Close();
                }
            }

           
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Form f = new HFormPNo();
            f.Show(this);
        }

        private void btnPWModify_Click(object sender, EventArgs e)
        {
            Form f = new FormPW();
            f.ShowDialog(this);
        }

        /*************************
         * 메서드 모음
         *************************/

        //입력 유무/유효성 검사
        private bool checkInputValue()
        {
            if (txtPNO.Text.Length == 0)
            {
                MessageBox.Show("개인번호를 입력하십시오.   ", "확인",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                txtPNO.Focus();
                return false;
            }

            if (!txtPNO.Text.Substring(0, 1).Equals("D") || txtPNO.Text.Length != 10)
            {
                MessageBox.Show("개인번호가 적절하지 않습니다.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtPNO.Text = "";
                txtPNO.Focus();
                return false;
            }

            if (txtName.Text.Length == 0)
            {
                MessageBox.Show("성명을 입력하십시오.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtName.Focus();
                return false;
            }

            if (txtOrganName.Text.Length == 0)
            {
                MessageBox.Show("소속기관을 선택하세요.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtOrganName.Focus();
                return false;
            }

            if (cboSubjectGroup.SelectedIndex == -1 || cboSubject.SelectedIndex == -1)
            {
                MessageBox.Show("교과목을 선택하세요.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                btnSearch.Focus();
                return false;
            }

            if (txtPasswd.Text.Length < 4)
            {
                MessageBox.Show("비밀번호(4글자 이상)를 입력하세요.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtPasswd.Focus();
                return false;
            }

            if (Config.State == Config.STATE_INIT)      //처음 입력할 때만 검사함
            {
                if (txtPasswdChk.Text.Length == 0)
                {
                    MessageBox.Show("비밀번호 확인을 입력하세요.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtPasswdChk.Focus();
                    return false;
                }

                if (txtPasswd.Text != txtPasswdChk.Text)
                {
                    MessageBox.Show("입력 하신 비밀번호가 일치하지 않습니다.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtPasswd.Text = "";
                    txtPasswdChk.Text = "";
                    txtPasswd.Focus();
                    return false;
                }

            }
            return true;

            
        }
   
        //DB에 레코드 삽입
        private bool insertData()
        {
            if (DBUtil.insertValuerInfo(mvi))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //DB의 레코드 수정
        private bool updateData()
        {
            if(DBUtil.updateValuerInfo(mvi)){
                return true;
            }else{
                return false;
            }
        }

        //입력한 데이터를 ModelValuerInfo 에 설정
        private void setMVIFromInput()
        {
            
            mvi.Pno = txtPNO.Text.Trim();
            mvi.Name = txtName.Text.Trim();
            mvi.Organ = DBUtil.getOrganCode(txtOrganName.Text);
            mvi.Subject = (string)cboSubject.Items[cboSubject.SelectedIndex];
            mvi.Passwd = txtPasswd.Text;
            DateTime now = DateTime.Now;
            mvi.Regtime = now;

        }

        //ModelValuerInfo 객체에서 컨트롤의 값을 설정
        private void setControlFromMVI()
        {
            txtPNO.Text = mvi.Pno;                                              //개인번호
            txtName.Text = mvi.Name;                                            //성명
            txtOrganName.Text = DBUtil.getOrganName(mvi.Organ);                 //소속기관
            string subject_group = DBUtil.getSubjectGroup(mvi.Subject);            
            for (int i = 0; i < cboSubjectGroup.Items.Count; i++)
            {
                if (subject_group.Equals((string)cboSubjectGroup.Items[i]))
                {
                    cboSubjectGroup.SelectedIndex = i;                           //교과목 그룹
                }
            }
            
            setSubject();                                                       //교과목 설정
            for (int i = 0; i < cboSubject.Items.Count; i++)
            {
                if (mvi.Subject.Equals((string)cboSubject.Items[i]))
                {
                    cboSubject.SelectedIndex = i;
                }
            }
            txtPasswd.Text = mvi.Passwd;

        }

        //데이터베이스에서 다면평가자 정보를 불러와서 ModelValuerInfo 에 설정
        private void setMVIFromDB()
        {
            ArrayList data = DBUtil.getValuerInfo();

            if (data != null)
            {
                mvi.Inx = (int)data[0];
                mvi.Pno = (string)data[1];
                mvi.Name = (string)data[2];
                mvi.Subject = (string)data[3];
                mvi.Organ = (string)data[4];
                mvi.Passwd = (string)data[5];
                mvi.Regtime = (DateTime)data[6];               
            }
        }

        //다른 폼에서 소속 기관 텍스트 박스에 값을 설정
        public static void setOrganName(string organ_name)
        {
            txtStaticOrganName.Text = organ_name;
        }

        //교과목 그룹 설정
        private void setSubjectGroup() {

            //과목그룹 세팅
            ArrayList list = DBUtil.getSubjectGroupList();

            if (list != null)
            {
                foreach (String data in list)
                {
                    cboSubjectGroup.Items.Add(data);
                }
            }
        
        }

        //교과목 설정
        private void setSubject()
        {
            
            //과목 세팅            
            ArrayList list = DBUtil.getSubject((string)cboSubjectGroup.Items[cboSubjectGroup.SelectedIndex]);

            cboSubject.Items.Clear();

            if (list != null)
            {
                foreach (String data in list)
                {
                    cboSubject.Items.Add(data);
                }
            }

        }

        

        

              
    }
}
